import java.util.Objects;

public class Solution {

    /**
     * 给定两个整数，被除数 dividend 和除数 divisor。将两数相除，要求不使用乘法、除法和 mod 运算符。
     * 返回被除数 dividend 除以除数 divisor 得到的商。
     * <p>
     * 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
     */
    public static int divide(int dividend, int divisor) {
        if (dividend == 0) {
            return 0;
        }
        if (divisor == Integer.MIN_VALUE) {
            if (dividend == Integer.MIN_VALUE) {
                return 1;
            } else {
                return 0;
            }
        }

        //判断符号
        boolean positive = dividend > 0;
        positive = !positive ^ (divisor > 0);

        //转负数
        if (dividend > 0) {
            dividend = -dividend;
        }
        if (divisor > 0) {
            divisor = -divisor;
        }

        //位移到除数到高位
        if (dividend > divisor) {
            return 0;
        } else if (dividend == divisor) {
            return positive ? 1 : -1;
        }

        int tmp;
        int count = 0;
        while (dividend < divisor) {
            tmp = divisor << 1;
            if (tmp >= 0) {
                break;
            } else {
                count++;
                divisor = tmp;
            }
        }

        //计算除法
        int result = 0;
        while (count-- > 0) {
            tmp = dividend - divisor;
            result = result << 1;
            if (tmp <= 0) {
                result++;
                dividend = tmp;
            }
            divisor = divisor >> 1;
        }

        result = result << 1;
        if (dividend <= divisor) {
            result++;
        }

        if (result==Integer.MIN_VALUE){
            return positive ? Integer.MAX_VALUE : result;
        }
        return positive ? result : -result;
    }

    public static void main(String[] args) {
        int end = Integer.MIN_VALUE;
        int isor = 1;
        System.out.println(divide(end, isor));
        System.out.println(end / isor);
    }

}